/**
 * 
 */
package com.atjava.nebula.core.dao.ibatis.projection;

/**投影的实现
 * @author kyo
 *
 */
public class Projection implements IProjection {
	private String aggregate;//聚合方法
	private String propertyName;//字段名
	private String alias;//别名
	private boolean grouped;//是否Group By
	
	/**构造方法，用于生成一个字段的投影
	 * @param prop 字段名
	 * @param grouped 是否分组
	 */
	public Projection(String prop,boolean grouped){
		this.aggregate = null;
		this.alias = prop;
		this.propertyName=prop;
		this.grouped=grouped;
		//this.having = having;
	}

	
	/**构造方法，用于生成一个字段的聚合投影，支持别名
	 * @param aggregate 聚合方法，如：sum,min
	 * @param prop 字段名
	 * @param alias 别名
	 */
	public Projection(String aggregate,String prop,String alias){
		this.aggregate = aggregate;
		this.alias = alias;
		this.propertyName=prop;
		this.grouped=false;		
		//this(aggregate,prop,alias,false);
	}	
	/**构造方法，用于生成一个字段的聚合投影
	 * @param aggregate 聚合类型，如：sum,min
	 * @param prop 字段名
	 */
	public Projection(String aggregate,String prop){
		this(aggregate,prop,prop);
	}
	/**对投影设置别名
	 * @param alias 别名
	 * @return 返回当前Projection(已设置别名)
	 */
	public IProjection as(String alias){
		this.alias=alias;
		return this;
	}


	/* 
	 * @see com.atjava.nebula.core.dao.ibatis.projection1.IProjection#toSqlString()
	 */
	public String toSqlString(){
		StringBuffer sql=new StringBuffer();
		if(aggregate != null){
			sql.append(aggregate)
				.append("(")
				.append( propertyName )
				.append(")");			
		}
		else{
			sql.append(propertyName);
		}
		if(alias != null){
			sql.append(" as ").append(alias);
		}
		return sql.toString();		
	}
	/* 
	 * @see com.atjava.nebula.core.dao.ibatis.projection1.IProjection#toGroupSqlString()
	 */
	public String toGroupSqlString(){
		if(isGrouped()){
			return propertyName;
		}
		else
			return null;
	}

	/* 
	 * @see com.atjava.nebula.core.dao.ibatis.projection1.IProjection#isGrouped()
	 */
	public boolean isGrouped() {
		return grouped;
	}
}
